// package com.ww.sound_emission.mq;
//
// import com.fasterxml.jackson.core.JsonProcessingException;
// import com.fasterxml.jackson.databind.ObjectMapper;
// import com.ww.sound_emission.domain.MacData;
// import com.ww.sound_emission.domain.MacProductSequence;
// import com.ww.sound_emission.domain.mqtt.MqttData;
// import com.ww.sound_emission.mapper.MacDataMapper;
// import com.ww.sound_emission.mapper.MacProductSequenceMapper;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.data.redis.core.StringRedisTemplate;
// import org.springframework.integration.annotation.ServiceActivator;
// import org.springframework.messaging.Message;
// import org.springframework.stereotype.Service;
// import org.springframework.transaction.annotation.Transactional;
//
// import java.util.concurrent.TimeUnit;
//
// @Service
// public class MqttMessageListener {
//
//     @Autowired
//     private StringRedisTemplate redisTemplate;  // Redis 操作模板
//
//     @Autowired
//     private ObjectMapper objectMapper;  // 用于 JSON 转换
//
//     @Autowired
//     private MacDataMapper macDataMapper;  // MyBatis-Plus Mapper
//
//     @Autowired
//     private MacProductSequenceMapper macProductSequenceMapper;
//
//     @ServiceActivator(inputChannel = "mqttInputChannel")
//     public void handleMqttMessage(Message<?> message) {
//         String topic = message.getHeaders().get("mqtt_receivedTopic", String.class);
//         System.out.println("mqtt_receivedTopic: " + topic);
//         String payload = (String) message.getPayload();
//         System.out.println("mqttInputChannel: " + payload);
//
//         try {
//             MqttData mqttData = objectMapper.readValue(payload, MqttData.class);
//             System.out.println("mqttData: " + mqttData);
//             String machineCode = extractMachineCodeFromTopic(topic);
//
//             Long time = mqttData.getTime();
//             // 将 MQTT 数据存储到 Redis
//             storeMqttDataInRedis(mqttData, machineCode,time);
//
//             // 此时返回，Redis 存储完成，后续从 Redis 获取数据并处理
//         } catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
//
//     // 从 MQTT 主题中提取机台编号
//     private String extractMachineCodeFromTopic(String topic) {
//         String[] topicParts = topic.split("/");
//         return topicParts[topicParts.length - 1];
//     }
//
//
//
//
//
//
//     /**
//      * 将 MQTT 数据存储到 Redis
//      */
//     private void storeMqttDataInRedis(MqttData mqttData, String machineCode,Long time) throws JsonProcessingException {
//         // 先将 MQTT 数据存储到 Redis
//         String payloadJson = null;
//         try {
//             payloadJson = objectMapper.writeValueAsString(mqttData);  // 转换为 JSON 字符串
//         } catch (JsonProcessingException e) {
//             e.printStackTrace();
//         }
//
//
//         // 使用 Redis 存储消息，Key 使用 machineCode + time 时间戳
//         String redisKey = "mqttData:" + machineCode+"-"+time;
//         redisTemplate.opsForValue().set(redisKey, payloadJson);
//
//         processMqttDataFromRedis(machineCode,time);
//         // 可选择设置过期时间，避免 Redis 内存占用过大
//         redisTemplate.expire(redisKey, 1, TimeUnit.HOURS);  // 设置一个小时的过期时间
//     }
//
//     /**
//      * 从 Redis 获取数据并存入数据库
//      */
//     @Transactional
//     public void processMqttDataFromRedis(String machineCode,Long time) throws JsonProcessingException {
//         // 从 Redis 获取存储的 MQTT 数据
//         String redisKey = "mqttData:" + machineCode+"-"+time;
//         String payloadJson = redisTemplate.opsForValue().get(redisKey);
//
//         if (payloadJson == null) {
//             System.out.println("No data found in Redis for machineCode: " + machineCode);
//             return;
//         }
//
//         try {
//             MqttData mqttData = objectMapper.readValue(payloadJson, MqttData.class);
//             System.out.println("Processing data for machineCode: " + machineCode);
//
//             MacData macData = new MacData();
//             macData.setT(mqttData.getCnc().getT());
//             macData.setMainProg(mqttData.getCnc().getMainProg());
//             macData.setSubProg(mqttData.getCnc().getSubProg());
//             macData.setX(mqttData.getCnc().getX());
//             macData.setY(mqttData.getCnc().getY());
//             macData.setZ(mqttData.getCnc().getZ());
//             macData.setDurtime(mqttData.getDurtime());
//
//             int currentStatus = mqttData.getCnc().getStatus();
//             macData.setStatus(currentStatus);
//             macData.setIo(mqttData.getSensor().getIo() ? 1 : 0);
//             macData.setIsShowSpl(mqttData.getSensor().getShowSpl() ? 1 : 0);
//             macData.setS(mqttData.getSensor().getS());
//             macData.setS1(mqttData.getSensor().getS1());
//             macData.setS2(mqttData.getSensor().getS2());
//             macData.setS3(mqttData.getSensor().getS3());
//             macData.setSpl(mqttData.getSensor().getSpl());
//             macData.setBreakStatus(mqttData.getSensor().getBreakStatus() ? 1 : 0);
//
//             macData.setMachineCode(machineCode);
//
//             // 获取当前时间戳
//             java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(System.currentTimeMillis());
//             macData.setCreateTime(currentTimestamp);
//
//             System.out.println("currentTimestamp"+currentTimestamp);
//             // 从 Redis 获取上一个状态
//             String previousStatusKey = "status:" + machineCode;
//             String statusFromRedis = redisTemplate.opsForValue().get(previousStatusKey);
//             Integer previousStatus = (statusFromRedis != null) ? Integer.valueOf(statusFromRedis) : 0;
//
//             System.out.println("productSequenceStored"+previousStatus);
//             System.out.println("currentStatus"+currentStatus);
//             // 处理状态为 2 的情况
//             String productSequenceStoredKey = "productSequenceStored:" + machineCode;
//             if (previousStatus == 1 && currentStatus == 2) {
//                 // 生成 productSequence
//                 String productSequence = mqttData.getCnc().getMainProg() + "-" + time+"-"+machineCode;
//                 macData.setProductSequence(productSequence);
//
//                 logStatusChange(productSequence);
//                 // 存储 productSequence 到 Redis
//                 redisTemplate.opsForValue().set("macData:" + productSequence, payloadJson);
//
//                 // 存储到 mac_product_sequence 表
//                 MacProductSequence macProductSequence = new MacProductSequence();
//                 macProductSequence.setMachineCode(machineCode);
//                 macProductSequence.setProductSequence(productSequence);
//                 macProductSequence.setCreateTime(currentTimestamp);
//                 macProductSequenceMapper.insert(macProductSequence);
//
//                 // 设置标志位表示已存储过 productSequence
//                 redisTemplate.opsForValue().set(productSequenceStoredKey, productSequence);
//
//                 // 插入 macData 到数据库
//                 macDataMapper.insert(macData);
//
//             } else if (currentStatus == 2 && previousStatus == 2) {
//                 // 继续使用上次存储的 productSequence
//                 String storedProductSequence = redisTemplate.opsForValue().get(productSequenceStoredKey);
//                 if (storedProductSequence != null) {
//                     macData.setProductSequence(storedProductSequence);
//                 }
//                 // 同时插入 mac_product_sequence 表中的记录（即保持对该 productSequence 的追踪）
//                 MacProductSequence macProductSequence = new MacProductSequence();
//                 macProductSequence.setMachineCode(machineCode);
//                 macProductSequence.setProductSequence(storedProductSequence);
//                 macProductSequence.setCreateTime(currentTimestamp);  // 使用当前时间戳
//                 macProductSequenceMapper.insert(macProductSequence);  // 插入到数据库
//
//                 // 插入数据库
//                 macDataMapper.insert(macData);
//             } else if (currentStatus != 2 && previousStatus == 2) {
//                 // 删除 Redis 中的 productSequence 数据
//                 String productSequence = macData.getProductSequence();
//                 if (productSequence != null) {
//                     redisTemplate.delete("macData:" + productSequence);
//                     redisTemplate.delete(productSequenceStoredKey);
//                 }
//
//                 System.out.println("productSequence: " + productSequence);
//                 // 不插入 productSequence 字段
//                 macData.setProductSequence(null);
//
//                 macDataMapper.insert(macData);
//
//             }else if (currentStatus != 2 && previousStatus != 2) {
//                 // 状态既不是 2 且之前的状态也不是 2，不存储 productSequence
//                 macData.setProductSequence(null);  // 不设置 productSequence
//                 macDataMapper.insert(macData);  // 直接插入其他字段
//             }
//
//             // 更新当前状态到 Redis
//             redisTemplate.opsForValue().set(previousStatusKey, String.valueOf(currentStatus));
//
//         } catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
//
//     private void logStatusChange(String productSequence) {
//         // 记录状态变化
//         System.out.println("Status changed from 1 to 2, productSequence: " + productSequence);
//     }
//
// }
//
